package com.cty.A_GeneralDataStructures.C_Tree.Tree234;

import com.cty.F_common.DataItem;

import javax.xml.crypto.Data;

/**
 * @Auther: cty
 * @Date: 2020/6/16 15:58
 * @Description: 234树节点
 * @version: 1.0
 */
public class Node {
    private final int ORDER = 4;
    private DataItem[] itemArray;
    private int nItems;
    private Node parent;
    private Node[] childArray;

    public Node(){
        itemArray = new DataItem[ORDER-1];
        nItems = 0;
        parent = null;
        childArray = new Node[ORDER];
    }

    public boolean isEmpty(){
        return (nItems == 0);
    }

    public boolean isFull(){
        return (nItems == ORDER-1);
    }

    public int getItemNums(){
        return nItems;
    }

    /**
     * 获取指定索引位置上的数据项
     * @param index
     * @return
     */
    public DataItem getItem(int index){
        if(index<0 || index>ORDER-2)
            return null;

        return itemArray[index];
    }

    /**
     * 设置指定位置上的数据项
     * @param index
     * @param item
     * @return
     */
    public boolean setItem(int index, DataItem item){
        if(index<0 || index>ORDER-2)
            return false;

        itemArray[index] = item;
        return true;
    }

    /**
     * 显示数据项
     */
    public void displayItem(){
        for(int i=0; i<nItems; i++) {
            itemArray[i].displayItem();
            System.out.print("/");
        }
        System.out.println();
    }

    /**
     * 查找指定关键字的数据项
     * @param key
     * @return
     */
    public DataItem findItem(long key){
        for(int i=0; i<nItems; i++)
            if(itemArray[i].getKey() == key)
                return itemArray[i];
        return null;  // 为空或不存在关键字为key的节点
    }

    /**
     * 有序插入数据项
     * @param item
     * @return
     */
    public int insertItem(DataItem item){
        if(isFull())
            return -1;  // 已满，插入失败

        // 查找合适的插入位置
        int i;
        for(i=getItemNums()-1; i>=0; i--){
            if(item.getKey() < itemArray[i].getKey())
                itemArray[i+1] = itemArray[i];
            else
                break;
        }
        itemArray[i+1] = item;
        nItems++;
        return i+1;  // 插入成功
    }  // end insert()

    /**
     * 删除尾部关键字最大的数据项
     */
    public DataItem removeItem(){
        if(isEmpty())
            return null;

        DataItem temp = itemArray[--nItems];
        return temp;
    }

    /**
     * 获取当前节点的父节点
     * @return
     */
    public Node getParent(){
        return parent;
    }

    /**
     * 获取当前节点指定的子节点
     * @param childNum
     * @return
     */
    public Node getChild(int childNum){
        return childArray[childNum];
    }

    /**
     * 判断当前节点是否为叶子节点
     * @return
     */
    public boolean isLeaf(){
        return (childArray[0]==null?true:false);
    }

    /**
     * 将当前节点连接为指定的子节点
     * @param childNum
     * @param child
     */
    public void connectChild(int childNum, Node child){
        childArray[childNum] = child;
        if(child != null)
            child.parent = this;
    }

    /**
     * 将当前节点的指定子节点断开连接，并返回该节点
     * @param childNum
     * @return
     */
    public Node disConnectChild(int childNum){
        Node temp = childArray[childNum];
        childArray[childNum] = null;
        return temp;
    }
}  // end Node{}
